import { exec } from "child_process";
import { join, relative } from "path";

const postgesqlSchemaPath = relative(
  process.cwd(),
  join(__dirname, `../postgresql/schema.prisma`),
);

const mysqlSchemaPath = relative(
  process.cwd(),
  join(__dirname, `../mysql/schema.prisma`),
);

type Options = {
  force?: boolean;
};

export const executePrismaCommand = (command: string, options?: Options) => {
  const databaseUrl =
    process.env.DATABASE_URL ?? (options?.force ? "postgresql://" : undefined);

  if (!databaseUrl) {
    console.error("Could not find DATABASE_URL in environment");
    process.exit(1);
    return;
  }

  if (databaseUrl?.startsWith("mysql://")) {
    console.log("Executing for MySQL schema");
    return executeCommand(`${command} --schema ${mysqlSchemaPath}`);
  }

  if (
    databaseUrl?.startsWith("postgres://") ||
    databaseUrl?.startsWith("postgresql://")
  ) {
    console.log("Executing for PostgreSQL schema");
    return executeCommand(`${command} --schema ${postgesqlSchemaPath}`);
  }

  console.error(
    "Invalid `DATABASE_URL` format, it should start with `postgresql://` or `postgres://`",
  );
  process.exit(1);
};

const executeCommand = (command: string) => {
  return new Promise<void>((resolve, reject) => {
    exec(command, (error, stdout, stderr) => {
      if (error) {
        console.log(error.message);
        reject(error);
        return;
      }
      if (stderr) {
        console.log(stderr);
        return;
      }
      console.log(stdout);
      resolve();
    });
  });
};
